#include <stdio.h>
#include <stdlib.h>

// 使用typedef struct可以直接使用LinkList *a
typedef struct nodell{
    int value;  //链表节点所保存的值
    struct nodell *next;
}LinkList;

// initialize linklist
LinkList *creat_linklist(int n){
    LinkList *head, *node, *end;  // 头节点，普通节点，和尾节点
    head = (LinkList*)malloc(sizeof(LinkList));
    end = head; //空链表，头尾节点一样
    for (int i=0; i<n; ++i){

        node = (LinkList*)malloc(sizeof(LinkList));
        node->value = i;
        //此处的end指向链表上最后一个node，也就是上一个生成的node
        //让其end的next指向当前生成的node，也就是上一个node指向了当前的node
        end->next = node;
        //当前node链上了上一个node，所以end指向最后一个node，也就是当前生成的node
        end = node;

    }
    end->next = 0;  //链表结束
    return head;  //返回表头
}

void modify_linklist(LinkList *list, int n, int val){
    // 输入n为需要修改的第n个节点
    // val为修改后的值
    LinkList *l = list;
    int i = 0;
    while (i < n && l != 0){
        l = l->next;
        ++i;
    }
    if (l != 0){
        l->value = val;
    }else{
        printf("Node doesn't exist! \n");
    }
}

void delete_node(LinkList *list, int n){
    LinkList *l = list, *prev;
    int i = 0;
    while (i < n && l != 0){
        prev = l;
        l = l->next;
        ++i;
    }
    if (l != 0){
        prev->next = l->next;
        free(l);
    }else{
        printf("Node doesn't exist! \n");
    }
}

void insert_node(LinkList *list, int n, int val){
    // 在第n节点后插入一个节点赋值val
    LinkList *l = list, *temp;

    int i = 0;
    while (i < n-1 && l != 0){
        l = l->next;
        ++i;
    }
    // 此时指针l指向第n个节点
    if (l != 0){
        temp = (LinkList *)malloc(sizeof(LinkList));  
        temp->value = val;
        temp->next = l->next;
        l->next = temp;
    }else{
        printf("Node does't exist. \n");
    }
}

void print_linklist(LinkList *list){
    LinkList *l = list;
    int i = 0;

    if (l->next == 0) printf("EMPTY! \n");
    while(l->next != 0){
        l = l->next;
        ++i;
        printf("%dth node: %d. \n", i, l->value);
    }
}

int main(void){

    int n = 10;
    LinkList *list_;
    list_ = creat_linklist(n);
    print_linklist(list_);

    modify_linklist(list_, 6, 55);
    print_linklist(list_);

    delete_node(list_, 6);
    print_linklist(list_);

    insert_node(list_, 6, 555);
    print_linklist(list_);

    for (int i=0; i<10; ++i){
        delete_node(list_, 1);
    }
    print_linklist(list_);

    return 0;
}